|
RAIS
3.2
|
00001 00028 using System; 00029 using System.Collections.Generic; 00030 using System.Data; 00031 using System.Data.SqlClient; 00032 using System.IO; 00033 using System.Text; 00034 using System.Xml; 00035 using Microsoft.Reporting.WebForms; 00036 using System.Configuration; 00037 using System.Globalization; 00038 00039 using RAIS.Common.DynamicMaskManagement; 00040 using RAIS.Common.UserManagement; 00041 using RAIS.DataAccessLayer; 00042 using RAIS.Common; 00043 using RAIS.Common.RADEVClasses; 00044 00045 namespace RAIS.ApplicationLogicLayer 00046 { 00047 public static class ReportManagement 00048 { 00049 enum ReportPart 00050 { 00051 Header, 00052 Details, 00053 Footer, 00054 GroupHeader, 00055 GroupFooter 00056 } 00057 //********************************************************************* 00058 #region Fields 00059 const string dataSourceName = "ReportDataSource"; 00060 const string dataSetName = "Report_Table"; 00061 const string rdlcFileName = "Reports/Template - RAIS standard.rdlc"; // - Test.rdlc"; // 00062 const string logoImageFileName = "Images/iaea.jpg"; 00063 const string rdlcNamespaceURI = "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"; 00064 const string rdNamespaceURI = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"; 00065 const string cellXml = 00066 "<TableCell xmlns=\"http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition\" xmlns:rd=\"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner\">" 00067 + " <ReportItems>" 00068 + " <Textbox Name=\"\">" 00069 + " <rd:DefaultName></rd:DefaultName>" 00070 + " <Style>" 00071 + " <PaddingLeft>2pt</PaddingLeft>" 00072 + " <PaddingRight>2pt</PaddingRight>" 00073 + " <PaddingTop>2pt</PaddingTop>" 00074 + " <PaddingBottom>2pt</PaddingBottom>" 00075 + " </Style>" 00076 + " <ZIndex>0</ZIndex>" 00077 + " <CanGrow>true</CanGrow>" 00078 + " <Value />" 00079 + " </Textbox>" 00080 + " </ReportItems>" 00081 + "</TableCell>"; 00082 00083 const string sizeUnitDecmalSeparator = "."; 00084 const string sizeUnit = "cm"; 00085 const string fontSizeUnit = "pt"; 00086 const string bodyFontSize = "9pt"; 00087 const string bodyFontFamily = "Arial"; 00088 const string groupsFontFamily = "Times New Roman"; 00089 00090 const double sheetLongSideLength = 29.7; 00091 const double sheetShortSideLength = 21; 00092 const double interactiveHeight = 4; 00093 const double leftMargin = 1; 00094 const double rightMargin = 1; 00095 const double tableTop = 0; 00096 const double tableHeight = 4.44444; 00097 const double rowHeight = 0.63492; 00098 const double firstColumnWidth = 0.5; 00099 const int groupFontSize = 11; 00100 00101 static string rdlcFullName; 00102 static XmlNamespaceManager namespaceManager; 00103 static DataSet dataSet; 00104 static XmlElement root; 00105 static Dictionary<int, string> groupColumns; 00106 static Dictionary<int, double> columnsWidths; 00107 static double pageHeight; 00108 static double pageWidth; 00109 static double reportWidth; 00110 static string reportName; 00111 static UserData currentUser; 00112 static string grouping; 00113 static string widths; 00114 static string dateRange=null; 00115 static string logoImageUrl; 00116 static string additionalFooterText; 00117 static bool _isRTL; 00118 #endregion Fields 00119 //********************************************************************* 00120 #region Properties 00121 00122 00123 00124 public static string DataSetName 00125 { 00126 get { return dataSetName; } 00127 } 00128 #endregion Properties 00129 //********************************************************************* 00130 #region Public methods 00131 00132 00133 00134 00135 00136 00137 00138 00139 static public MemoryStream CreateReportDefinition(DynamicMaskData dynamicMaskData 00140 , string sitePath, string siteURL, string orientation, string cultureName, bool isRTL) 00141 { 00142 _isRTL = isRTL; 00143 MemoryStream reportDefinitionStream = new MemoryStream(); 00144 00145 logoImageUrl = siteURL + logoImageFileName; 00146 SetDateRange(dynamicMaskData); 00147 dataSet = dynamicMaskData.DataSet; 00148 currentUser = dynamicMaskData.CurrentUser; 00149 reportName = dynamicMaskData.DynamicMask.Name; 00150 grouping = dynamicMaskData.DynamicMask.Grouping; 00151 widths = dynamicMaskData.DynamicMask.Widths; 00152 additionalFooterText = dynamicMaskData.DynamicMask.Footer; 00153 00154 00155 // Remove _ID fields from dataset 00156 foreach (DataTable table in dataSet.Tables) 00157 { 00158 for (int i = 0; i < table.Columns.Count; i++) 00159 { 00160 if ((table.Columns[i].ColumnName.Contains("PK ") && table.Columns[i].ColumnName.Contains(" ID")) || 00161 (table.Columns[i].ColumnName.Contains("FK ") && table.Columns[i].ColumnName.Contains(" ID"))) 00162 { 00163 table.Columns.Remove(table.Columns[i]); 00164 i--; 00165 } 00166 } 00167 } // End Remove _ID fields from dataset 00168 00169 00170 00171 if (orientation == "Portrait") 00172 { 00173 pageHeight = sheetLongSideLength; 00174 pageWidth = sheetShortSideLength; 00175 } 00176 else 00177 { 00178 pageHeight = sheetShortSideLength; 00179 pageWidth = sheetLongSideLength; 00180 } 00181 reportWidth = pageWidth - leftMargin - rightMargin; 00182 00183 // Parse groping string into grouping columns Dictionary 00184 ParseGrouppingString(); 00185 00186 // Parse widths string into columnsWidths Dictionary 00187 ParseWidthsString(); 00188 00189 // Load xml report definition 00190 XmlDocument xmlReportDefinition = new XmlDocument(); 00191 rdlcFullName = string.Format("{0}/{1}", sitePath, rdlcFileName); 00192 xmlReportDefinition.Load(rdlcFullName); 00193 root = xmlReportDefinition.DocumentElement; 00194 00195 // Create namespace manager 00196 namespaceManager = new XmlNamespaceManager(xmlReportDefinition.NameTable); 00197 namespaceManager.AddNamespace("rdlc", rdlcNamespaceURI); 00198 namespaceManager.AddNamespace("rd", rdNamespaceURI); 00199 00200 //-- Xml processing 00201 // Set language 00202 string languageNodePath = "//rdlc:Language"; 00203 XmlNode languageNode = root.SelectSingleNode(languageNodePath, namespaceManager); 00204 if (languageNode != null) 00205 languageNode.InnerText = cultureName;//System.Globalization.CultureInfo.CurrentCulture.Name; 00206 00207 // Page settings 00208 SetPageSettings(); 00209 00210 // Set Page header settings 00211 SetPageHeaderSettings(); 00212 00213 // Create DataSources 00214 AddDataSourcesNode(); 00215 00216 // Create DataSets 00217 AdddataSetsNode(); 00218 00219 // Change Body definition 00220 XmlElement tableElement = CreateBodyDefinition(); 00221 00222 // Add Table groups 00223 if (groupColumns.Count != 0) 00224 AddTableGroups(tableElement); 00225 00226 // Create Header Cells 00227 AddReportPart(tableElement, ReportPart.Header, 0, 0); 00228 00229 // Create Details Cells 00230 AddReportPart(tableElement, ReportPart.Details, 0, 0); 00231 00232 // Create Footer Cells 00233 AddReportPart(tableElement, ReportPart.Footer, 0, 0); 00234 00235 // Page Footer elements 00236 SetPageFooterControlsSettings(); 00237 00238 // Save to stream 00239 xmlReportDefinition.Save(reportDefinitionStream); 00240 reportDefinitionStream.Position = 0; 00241 00242 return reportDefinitionStream; 00243 } 00251 static public Microsoft.Reporting.WebForms.ReportDataSource GetRADEVDataSource(string provaderName, string reportName, RADEVCriterias criterias) 00252 { 00253 Common.RADEVClasses.RADEVTable tab = Common.RADEVClasses.RADEVTable.CreateTable(provaderName, reportName); 00254 return new Microsoft.Reporting.WebForms.ReportDataSource(tab.GetSourceName(), tab.GetDataList(criterias)); 00255 } 00262 static public List<RADEVTable> GetRADEVLineList(string provaderName,RADEVCriterias criterias) 00263 { 00264 Common.RADEVClasses.RADEVTable tab = Common.RADEVClasses.RADEVTable.CreateTable(provaderName, "EventMaster"); 00265 return (List<RADEVTable>)tab.GetDataList(criterias); 00266 } 00274 static public MemoryStream GetTranslatedReportDefinition(UserData user, string rdlcFileName, string siteUrl, string cultureName, bool isRTL) 00275 { 00276 _isRTL = isRTL; 00277 currentUser = user; 00278 MemoryStream reportDefinitionStream = new MemoryStream(); 00279 00280 // Load xml report definition 00281 XmlDocument xmlReportDefinition = new XmlDocument(); 00282 xmlReportDefinition.Load(rdlcFileName); 00283 root = xmlReportDefinition.DocumentElement; 00284 00285 // Create namespace manager 00286 namespaceManager = new XmlNamespaceManager(xmlReportDefinition.NameTable); 00287 namespaceManager.AddNamespace("rdlc", rdlcNamespaceURI); 00288 namespaceManager.AddNamespace("rd", rdNamespaceURI); 00289 00290 string headerImageValueNodePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Image/rdlc:Value"; 00291 XmlNode headerImageValueNode = root.SelectSingleNode(headerImageValueNodePath, namespaceManager); 00292 if (headerImageValueNode != null) 00293 { 00294 headerImageValueNode.InnerText = string.Format("=\"{0}\"", siteUrl + "Images/RADEV_header_logo_new.jpg"); 00295 } 00296 00297 headerImageValueNodePath = "//rdlc:PageFooter/rdlc:ReportItems/rdlc:Image/rdlc:Value"; 00298 headerImageValueNode = root.SelectSingleNode(headerImageValueNodePath, namespaceManager); 00299 if (headerImageValueNode != null) 00300 { 00301 headerImageValueNode.InnerText = string.Format("=\"{0}\"", siteUrl+"/Images/RADEV_footer_logo_new.jpg"); 00302 } 00303 00304 //-- Xml processing 00305 // Set language 00306 string languageNodePath = "//rdlc:Language"; 00307 XmlNode languageNode = root.SelectSingleNode(languageNodePath, namespaceManager); 00308 if (languageNode != null) 00309 languageNode.InnerText = cultureName; 00310 00311 XmlNode nodeForTranslation; 00312 nodeForTranslation = root.SelectSingleNode("//rdlc:PageHeader", namespaceManager); 00313 if (nodeForTranslation != null) 00314 TranslateTextBoxes(nodeForTranslation); 00315 00316 nodeForTranslation = root.SelectSingleNode("//rdlc:Body", namespaceManager); 00317 if (nodeForTranslation != null) 00318 TranslateTextBoxes(nodeForTranslation); 00319 00320 nodeForTranslation = root.SelectSingleNode("//rdlc:PageFooter", namespaceManager); 00321 if (nodeForTranslation != null) 00322 TranslateTextBoxes(nodeForTranslation); 00323 00324 AddDirrectionNode(root.SelectSingleNode("//rdlc:Body/rdlc:ReportItems/rdlc:List", namespaceManager)); 00325 00326 if(_isRTL) 00327 ReversTextBoxs(xmlReportDefinition, namespaceManager); 00328 00329 // Save to stream 00330 xmlReportDefinition.Save(reportDefinitionStream); 00331 reportDefinitionStream.Position = 0; 00332 00333 return reportDefinitionStream; 00334 } 00335 #endregion Public methods 00336 //********************************************************************* 00337 #region Private methods 00338 00339 static void ParseGrouppingString() 00340 { 00341 if (groupColumns == null) 00342 groupColumns = new Dictionary<int, string>(); 00343 else 00344 groupColumns.Clear(); 00345 00346 string[] groups = grouping.Split(new char[] { ';' }); 00347 foreach (string groupIndex in groups) 00348 { 00349 int colNumber; 00350 bool success = int.TryParse(groupIndex, out colNumber); 00351 if (success && colNumber >= 0 && colNumber < dataSet.Tables[0].Columns.Count) 00352 groupColumns.Add(colNumber, dataSet.Tables[0].Columns[colNumber].ColumnName); 00353 } 00354 } 00355 00356 static void ParseWidthsString() 00357 { 00358 if (columnsWidths == null) 00359 columnsWidths = new Dictionary<int, double>(); 00360 else 00361 columnsWidths.Clear(); 00362 00363 // Fill columnWidths dictionary from widths string 00364 string[] widthsArray = widths.Split(new char[] { ';' }); 00365 int i = 0; 00366 foreach (string columnWidth in widthsArray) 00367 { 00368 //double width = 0; 00369 //bool success = StringToDouble(columnWidth, out width); 00370 double widthInPercent = 0; 00371 double widthInReportUnits = 0; 00372 bool success = StringToDouble(columnWidth, out widthInPercent); 00373 widthInReportUnits = 00374 (groupColumns.Count == 0 ? reportWidth : reportWidth - firstColumnWidth) 00375 * widthInPercent / 100; 00376 if (success && !groupColumns.ContainsKey(i)) 00377 //columnsWidths.Add(i, width); 00378 columnsWidths.Add(i, widthInReportUnits); 00379 else 00380 columnsWidths.Add(i, 0); 00381 i++; 00382 } 00383 00384 // Add items to dictionary for omited columns 00385 if (dataSet.Tables[0].Columns.Count > columnsWidths.Count) 00386 { 00387 for (int n = columnsWidths.Count; n < dataSet.Tables[0].Columns.Count; n++) 00388 columnsWidths.Add(n, 0); 00389 } 00390 00391 // Calculate missed columns width 00392 double predefinedColumsWidth = 0; 00393 int notPredefinedColumnsNumber = 0; 00394 foreach (KeyValuePair<int, double> kvp in columnsWidths) 00395 { 00396 predefinedColumsWidth += kvp.Value; 00397 if (kvp.Value == 0 && !groupColumns.ContainsKey(kvp.Key)) 00398 notPredefinedColumnsNumber++; 00399 } 00400 00401 if (predefinedColumsWidth < reportWidth) 00402 { 00403 double missedColumnWidth = 00404 (reportWidth - predefinedColumsWidth - ((groupColumns.Count != 0) ? firstColumnWidth : 0)) / notPredefinedColumnsNumber; 00405 00406 for (int n = 0; n < columnsWidths.Count; n++ ) 00407 { 00408 if (columnsWidths[n] == 0 && !groupColumns.ContainsKey(n)) 00409 columnsWidths[n] = missedColumnWidth; 00410 } 00411 } 00412 else 00413 { 00414 double columnWidth = 00415 (reportWidth - ((groupColumns.Count != 0) ? firstColumnWidth : 0)) / (dataSet.Tables[0].Columns.Count - groupColumns.Count); 00416 00417 for (int n = 0; n < columnsWidths.Count; n++) 00418 { 00419 columnsWidths[n] = columnWidth; 00420 } 00421 } 00422 } 00423 00424 static void SetPageSettings() 00425 { 00426 string interactiveHeightNodePath = "//rdlc:InteractiveHeight"; 00427 XmlNode interactiveHeightNode = root.SelectSingleNode(interactiveHeightNodePath, namespaceManager); 00428 if (interactiveHeightNode != null) 00429 interactiveHeightNode.InnerText = ReportSize(interactiveHeight); 00430 00431 string pageHeightNodePath = "//rdlc:PageHeight"; 00432 XmlNode pageHeightNode = root.SelectSingleNode(pageHeightNodePath, namespaceManager); 00433 if (pageHeightNode != null) 00434 pageHeightNode.InnerText = ReportSize(pageHeight); 00435 00436 string interactiveWidthNodePath = "//rdlc:InteractiveWidth"; 00437 XmlNode interactiveWidthNode = root.SelectSingleNode(interactiveWidthNodePath, namespaceManager); 00438 if (interactiveWidthNode != null) 00439 interactiveWidthNode.InnerText = ReportSize(pageWidth); 00440 00441 string pageWidthNodePath = "//rdlc:PageWidth"; 00442 XmlNode pageWidthNode = root.SelectSingleNode(pageWidthNodePath, namespaceManager); 00443 if (pageWidthNode != null) 00444 pageWidthNode.InnerText = ReportSize(pageWidth); 00445 00446 string widthNodePath = "//rdlc:Width"; 00447 XmlNode widthNode = root.SelectSingleNode(widthNodePath, namespaceManager); 00448 if (widthNode != null) 00449 widthNode.InnerText = ReportSize(reportWidth); 00450 00451 } 00452 00453 static void SetDateRange() 00454 { 00455 if (dateRange == null) return; 00456 string textBoxNodeString = 00457 "<Textbox Name=\"DateRange\">" + 00458 " <Top>3.25cm</Top>" + 00459 " <Width>19cm</Width>" + 00460 " <Style>" + 00461 " <Color>White</Color>" + 00462 " <BackgroundColor>LightGrey</BackgroundColor>" + 00463 " <FontFamily>Times New Roman</FontFamily> " + 00464 " <PaddingLeft>2pt</PaddingLeft>" + 00465 " <PaddingRight>2pt</PaddingRight>" + 00466 " <PaddingTop>2pt</PaddingTop>" + 00467 " <PaddingBottom>2pt</PaddingBottom>" + 00468 " <TextAlign>Left</TextAlign>" + 00469 " </Style>" + 00470 " <ZIndex>1</ZIndex>" + 00471 " <CanGrow>true</CanGrow>" + 00472 " <Left>0.25cm</Left>" + 00473 " <Value>Text</Value>" + 00474 " <Height>0.5cm</Height>" + 00475 "</Textbox>"; 00476 00477 string reportNameNodePath = "//rdlc:PageHeader/rdlc:ReportItems"; 00478 XmlNode reportItemsNode = root.SelectSingleNode(reportNameNodePath, namespaceManager); 00479 reportItemsNode.InnerXml = reportItemsNode.InnerXml + textBoxNodeString; 00480 string valuePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Textbox[@Name='DateRange']/rdlc:Value"; 00481 root.SelectSingleNode(valuePath, namespaceManager).InnerText = dateRange; 00482 } 00483 00484 static void SetDateRange(DynamicMaskData dynamicMaskData) 00485 { 00486 dateRange = null; 00487 foreach (DynamicMaskFilterData filter in dynamicMaskData.FiltersData.Values) 00488 if (filter.DynamicMaskFilter.Type == DynamicMaskFilter.FilterType.DatesRage) 00489 dateRange = string.Format("Period: {0} until {1}", filter.DateFrom.ToString("dd.MM.yyyy"), filter.DateUntil.ToString("dd.MM.yyyy")); 00490 } 00491 00492 static void SetPageHeaderSettings() 00493 { 00494 // Set Report name 00495 string reportNameNodePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Textbox[@Name='TXTreporttitle']/rdlc:Value"; 00496 XmlNode reportNameNode = root.SelectSingleNode(reportNameNodePath, namespaceManager); 00497 if (reportNameNode != null) 00498 { 00499 reportNameNode.InnerText = ReportingTranslation(reportName); 00500 } 00501 00502 // Set path of header image 00503 string headerImageValueNodePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Image/rdlc:Value"; 00504 XmlNode headerImageValueNode = root.SelectSingleNode(headerImageValueNodePath, namespaceManager); 00505 if (headerImageValueNode != null) 00506 { 00507 headerImageValueNode.InnerText = string.Format("=\"{0}\"", logoImageUrl); 00508 } 00509 00510 // Set Left position of header image 00511 string headerImageWidthNodePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Image/rdlc:Width"; 00512 XmlNode headerImageWidthNode = root.SelectSingleNode(headerImageWidthNodePath, namespaceManager); 00513 string headerImageLeftNodePath = "//rdlc:PageHeader/rdlc:ReportItems/rdlc:Image/rdlc:Left"; 00514 XmlNode headerImageLeftNode = root.SelectSingleNode(headerImageLeftNodePath, namespaceManager); 00515 if (headerImageWidthNode != null 00516 && headerImageLeftNode != null) 00517 { 00518 double imageWidth = 0; 00519 bool success = ReportUnitToDouble(headerImageWidthNode.InnerText, out imageWidth); 00520 if (success) 00521 { 00522 double left = (reportWidth - imageWidth) / 2; 00523 headerImageLeftNode.InnerText = ReportSize(left); 00524 } 00525 } 00526 SetDateRange(); 00527 } 00528 00529 static void AddDataSourcesNode() 00530 { 00531 string dataSourcesNodePath = "//rdlc:DataSources"; 00532 XmlNode dataSourcesNode = root.SelectSingleNode(dataSourcesNodePath, namespaceManager); 00533 if (dataSourcesNode != null) 00534 { 00535 root.RemoveChild(dataSourcesNode); 00536 } 00537 XmlElement dataSourcesElement = root.OwnerDocument.CreateElement("DataSources", rdlcNamespaceURI); 00538 root.AppendChild(dataSourcesElement); 00539 00540 XmlElement dataSourceElement = root.OwnerDocument.CreateElement("DataSource", rdlcNamespaceURI); 00541 dataSourceElement.SetAttribute("Name", dataSourceName); 00542 dataSourcesElement.AppendChild(dataSourceElement); 00543 00544 XmlElement connectionPropertiesElement = root.OwnerDocument.CreateElement("ConnectionProperties", rdlcNamespaceURI); 00545 dataSourceElement.AppendChild(connectionPropertiesElement); 00546 00547 XmlElement dataProviderElement = root.OwnerDocument.CreateElement("DataProvider", rdlcNamespaceURI); 00548 dataProviderElement.InnerText = "SQL"; 00549 connectionPropertiesElement.AppendChild(dataProviderElement); 00550 00551 XmlElement connectStringElement = root.OwnerDocument.CreateElement("ConnectString", rdlcNamespaceURI); 00552 connectionPropertiesElement.AppendChild(connectStringElement); 00553 } 00554 00555 static void AdddataSetsNode() 00556 { 00557 string dataSetsNodePath = "//rdlc:DataSets"; 00558 XmlNode dataSetsNode = root.SelectSingleNode(dataSetsNodePath, namespaceManager); 00559 if (dataSetsNode != null) 00560 { 00561 root.RemoveChild(dataSetsNode); 00562 } 00563 XmlElement dataSetsElement = root.OwnerDocument.CreateElement("DataSets", rdlcNamespaceURI); 00564 root.AppendChild(dataSetsElement); 00565 00566 XmlElement dataSetElement = root.OwnerDocument.CreateElement("DataSet", rdlcNamespaceURI); 00567 dataSetElement.SetAttribute("Name", dataSetName); 00568 dataSetsElement.AppendChild(dataSetElement); 00569 00570 XmlElement fieldsElement = root.OwnerDocument.CreateElement("Fields", rdlcNamespaceURI); 00571 dataSetElement.AppendChild(fieldsElement); 00572 00573 for (int i = 0; i < dataSet.Tables[0].Columns.Count; i++) 00574 { 00575 XmlElement fieldElement = root.OwnerDocument.CreateElement("Field", rdlcNamespaceURI); 00576 fieldElement.SetAttribute("Name", ReportColumnName(dataSet.Tables[0].Columns[i].ColumnName)); 00577 fieldsElement.AppendChild(fieldElement); 00578 00579 XmlElement dataFieldElement = root.OwnerDocument.CreateElement("DataField", rdlcNamespaceURI); 00580 dataFieldElement.InnerText = dataSet.Tables[0].Columns[i].ColumnName; 00581 fieldElement.AppendChild(dataFieldElement); 00582 00583 XmlElement typeNameElement = root.OwnerDocument.CreateElement("TypeName", rdNamespaceURI); 00584 typeNameElement.InnerText = "System.String"; //dataSet.Tables[0].Columns[i].DataType.FullName; // 00585 fieldElement.AppendChild(typeNameElement); 00586 } 00587 00588 XmlElement queryElement = root.OwnerDocument.CreateElement("Query", rdlcNamespaceURI); 00589 dataSetElement.AppendChild(queryElement); 00590 00591 XmlElement dataSourceNameElement = root.OwnerDocument.CreateElement("DataSourceName", rdlcNamespaceURI); 00592 dataSourceNameElement.InnerText = dataSourceName; 00593 queryElement.AppendChild(dataSourceNameElement); 00594 00595 XmlElement commandTextElement = root.OwnerDocument.CreateElement("CommandText", rdlcNamespaceURI); 00596 queryElement.AppendChild(commandTextElement); 00597 00598 XmlElement useGenericDesignerElement = root.OwnerDocument.CreateElement("UseGenericDesigner", rdNamespaceURI); 00599 useGenericDesignerElement.InnerText = "true"; 00600 queryElement.AppendChild(useGenericDesignerElement); 00601 } 00602 00603 static XmlElement CreateBodyDefinition() 00604 { 00605 string bodyNodePath = "//rdlc:Body"; 00606 XmlNode bodyNode = root.SelectSingleNode(bodyNodePath, namespaceManager); 00607 00608 00609 // Create ReportItems element (delete existing before creation) 00610 string reportItemsNodePath = "//rdlc:Body/rdlc:ReportItems"; 00611 XmlNode reportItemsNode = root.SelectSingleNode(reportItemsNodePath, namespaceManager); 00612 if (reportItemsNode != null) 00613 { 00614 bodyNode.RemoveChild(reportItemsNode); 00615 } 00616 XmlElement reportItemsElement = bodyNode.OwnerDocument.CreateElement("ReportItems", rdlcNamespaceURI); 00617 bodyNode.AppendChild(reportItemsElement); 00618 00619 // Add Table element 00620 XmlElement tableElement = bodyNode.OwnerDocument.CreateElement("Table", rdlcNamespaceURI); 00621 tableElement.SetAttribute("Name", "table1"); 00622 reportItemsElement.AppendChild(tableElement); 00623 00624 XmlElement tableDataSetNameElement = bodyNode.OwnerDocument.CreateElement("DataSetName", rdlcNamespaceURI); 00625 tableDataSetNameElement.InnerText = dataSetName; 00626 tableElement.AppendChild(tableDataSetNameElement); 00627 00628 XmlElement tableTopElement = bodyNode.OwnerDocument.CreateElement("Top", rdlcNamespaceURI); 00629 tableTopElement.InnerText = ReportSize(tableTop); 00630 tableElement.AppendChild(tableTopElement); 00631 00632 XmlElement tableHeightElement = bodyNode.OwnerDocument.CreateElement("Height", rdlcNamespaceURI); 00633 tableHeightElement.InnerText = ReportSize(tableHeight); 00634 tableElement.AppendChild(tableHeightElement); 00635 00636 XmlElement tableWidthElement = bodyNode.OwnerDocument.CreateElement("Width", rdlcNamespaceURI); 00637 tableWidthElement.InnerText = ReportSize(reportWidth); 00638 tableElement.AppendChild(tableWidthElement); 00639 00640 // Add Table Columns 00641 XmlElement tableColumnsElement = tableElement.OwnerDocument.CreateElement("TableColumns", rdlcNamespaceURI); 00642 tableElement.AppendChild(tableColumnsElement); 00643 00644 if (groupColumns.Count != 0) 00645 { 00646 XmlElement tableColumnElement = tableElement.OwnerDocument.CreateElement("TableColumn", rdlcNamespaceURI); 00647 tableColumnsElement.AppendChild(tableColumnElement); 00648 XmlElement tableColumnWidthElement = tableElement.OwnerDocument.CreateElement("Width", rdlcNamespaceURI); 00649 tableColumnWidthElement.InnerText = ReportSize(firstColumnWidth); 00650 tableColumnElement.AppendChild(tableColumnWidthElement); 00651 } 00652 00653 for (int i = 0; i < dataSet.Tables[0].Columns.Count; i++) 00654 { 00655 if (!groupColumns.ContainsKey(i)) 00656 { 00657 XmlElement tableColumnElement = tableElement.OwnerDocument.CreateElement("TableColumn", rdlcNamespaceURI); 00658 tableColumnsElement.AppendChild(tableColumnElement); 00659 XmlElement tableColumnWidthElement = tableElement.OwnerDocument.CreateElement("Width", rdlcNamespaceURI); 00660 tableColumnWidthElement.InnerText = ReportSize(columnsWidths[i]); 00661 tableColumnElement.AppendChild(tableColumnWidthElement); 00662 } 00663 } 00664 return tableElement; 00665 } 00666 00667 static void AddTableGroups(XmlElement parentElement) 00668 { 00669 XmlElement tableGroupsElement = parentElement.OwnerDocument.CreateElement("TableGroups", rdlcNamespaceURI); 00670 parentElement.AppendChild(tableGroupsElement); 00671 00672 int i = 0; 00673 foreach (KeyValuePair<int, string> kvp in groupColumns) 00674 { 00675 int columnNumber = kvp.Key; 00676 int groupLevel = groupColumns.Count - 1 - i; 00677 string fullColumnName = kvp.Value; 00678 string columnName = ReportColumnName(fullColumnName); 00679 00680 XmlElement tableGroupElement = parentElement.OwnerDocument.CreateElement("TableGroup", rdlcNamespaceURI); 00681 tableGroupsElement.AppendChild(tableGroupElement); 00682 00683 XmlElement groupingElement = parentElement.OwnerDocument.CreateElement("Grouping", rdlcNamespaceURI); 00684 groupingElement.SetAttribute("Name", "table1_group" + columnNumber.ToString()); 00685 tableGroupElement.AppendChild(groupingElement); 00686 00687 XmlElement groupExpressionsElement = parentElement.OwnerDocument.CreateElement("GroupExpressions", rdlcNamespaceURI); 00688 groupingElement.AppendChild(groupExpressionsElement); 00689 00690 XmlElement groupExpressionElement = parentElement.OwnerDocument.CreateElement("GroupExpression", rdlcNamespaceURI); 00691 groupExpressionElement.InnerText = string.Format("=IIf(IsNothing(Fields!{0}.Value), \"not specified\",Fields!{0}.Value)", columnName); 00692 groupExpressionsElement.AppendChild(groupExpressionElement); 00693 00694 XmlElement sortingElement = parentElement.OwnerDocument.CreateElement("Sorting", rdlcNamespaceURI); 00695 tableGroupElement.AppendChild(sortingElement); 00696 00697 XmlElement sortByElement = parentElement.OwnerDocument.CreateElement("SortBy", rdlcNamespaceURI); 00698 sortingElement.AppendChild(sortByElement); 00699 00700 XmlElement sortExpressionElement = parentElement.OwnerDocument.CreateElement("SortExpression", rdlcNamespaceURI); 00701 sortExpressionElement.InnerText = string.Format("=IIf(IsNothing(Fields!{0}.Value), \"not specified\",Fields!{0}.Value)", columnName); 00702 sortByElement.AppendChild(sortExpressionElement); 00703 00704 XmlElement directionElement = parentElement.OwnerDocument.CreateElement("Direction", rdlcNamespaceURI); 00705 directionElement.InnerText = "Ascending"; 00706 sortByElement.AppendChild(directionElement); 00707 00708 AddReportPart(tableGroupElement, ReportPart.GroupHeader, columnNumber, groupLevel); 00709 //AddReportPart(tableGroupElement, ReportPart.GroupFooter, columnNumber); 00710 i++; 00711 } 00712 } 00713 00714 static void AddReportPart(XmlElement parentElement, ReportPart reportPart, int columnNumber, int groupLevel) 00715 { 00716 string reportPartElementName = string.Empty; 00717 switch (reportPart) 00718 { 00719 case ReportPart.Header: 00720 case ReportPart.GroupHeader: 00721 reportPartElementName = "Header"; 00722 break; 00723 case ReportPart.Details: 00724 reportPartElementName = "Details"; 00725 break; 00726 case ReportPart.Footer: 00727 case ReportPart.GroupFooter: 00728 reportPartElementName = "Footer"; 00729 break; 00730 } 00731 00732 XmlElement reportPartElement = parentElement.OwnerDocument.CreateElement(reportPartElementName, rdlcNamespaceURI); 00733 parentElement.AppendChild(reportPartElement); 00734 00735 XmlElement tableRowsElement = reportPartElement.OwnerDocument.CreateElement("TableRows", rdlcNamespaceURI); 00736 reportPartElement.AppendChild(tableRowsElement); 00737 XmlElement tableRowElement = reportPartElement.OwnerDocument.CreateElement("TableRow", rdlcNamespaceURI); 00738 tableRowsElement.AppendChild(tableRowElement); 00739 XmlElement tableCellsElement = reportPartElement.OwnerDocument.CreateElement("TableCells", rdlcNamespaceURI); 00740 tableRowElement.AppendChild(tableCellsElement); 00741 00742 if (reportPart == ReportPart.GroupHeader 00743 || reportPart == ReportPart.GroupFooter) 00744 { 00745 AddTableCell(tableCellsElement, groupColumns[columnNumber], reportPart, groupLevel); 00746 } 00747 else 00748 { 00749 if (groupColumns.Count != 0) 00750 AddTableCell(tableCellsElement, string.Empty, reportPart, groupLevel); 00751 00752 int from = _isRTL ? dataSet.Tables[0].Columns.Count - 1 : 0; 00753 int to = _isRTL ? -1 : dataSet.Tables[0].Columns.Count; 00754 int increment = _isRTL ? -1 : 1; 00755 00756 for (int i = from; i != to; i+=increment) 00757 { 00758 if (!groupColumns.ContainsKey(i)) 00759 { 00760 string columnName = dataSet.Tables[0].Columns[i].ColumnName; 00761 AddTableCell(tableCellsElement, columnName, reportPart, groupLevel); 00762 } 00763 } 00764 } 00765 XmlElement tableRowHeightElement = reportPartElement.OwnerDocument.CreateElement("Height", rdlcNamespaceURI); 00766 tableRowHeightElement.InnerText = ReportSize(rowHeight); 00767 tableRowElement.AppendChild(tableRowHeightElement); 00768 } 00769 00770 static void AddTableCell(XmlElement cellsElement, string fullColumnName, ReportPart reportPart, int groupLevel) 00771 { 00772 string columnName = ReportColumnName(fullColumnName); 00773 00774 XmlDocumentFragment cellFragment = cellsElement.OwnerDocument.CreateDocumentFragment(); 00775 cellFragment.InnerXml = cellXml; 00776 XmlNode newNode = cellFragment.SelectSingleNode("//rdlc:TableCell", namespaceManager); 00777 00778 if (reportPart == ReportPart.GroupHeader 00779 || reportPart == ReportPart.GroupFooter) 00780 { 00781 XmlElement colspanElement = newNode.OwnerDocument.CreateElement("ColSpan", rdlcNamespaceURI); 00782 colspanElement.InnerXml = (dataSet.Tables[0].Columns.Count - groupColumns.Count + 1).ToString(); 00783 newNode.AppendChild(colspanElement); 00784 } 00785 00786 XmlNode textbox = newNode.SelectSingleNode("//rdlc:Textbox", namespaceManager); 00787 textbox.Attributes["Name"].Value = columnName + reportPart.ToString(); 00788 00789 AddDirrectionNode(textbox); 00790 00791 XmlNode defaultName = newNode.SelectSingleNode("//rdlc:Textbox/rd:DefaultName", namespaceManager); 00792 defaultName.InnerText = columnName + reportPart.ToString(); 00793 00794 XmlNode styleElement = newNode.SelectSingleNode("//rdlc:Textbox/rdlc:Style", namespaceManager); 00795 if (reportPart == ReportPart.Header) 00796 { 00797 XmlElement borderStyleElement = cellsElement.OwnerDocument.CreateElement("BorderStyle", rdlcNamespaceURI); 00798 styleElement.AppendChild(borderStyleElement); 00799 00800 XmlElement bottomElement = cellsElement.OwnerDocument.CreateElement("Bottom", rdlcNamespaceURI); 00801 bottomElement.InnerText = "Solid"; 00802 borderStyleElement.AppendChild(bottomElement); 00803 } 00804 00805 if (reportPart == ReportPart.GroupHeader) 00806 { 00807 if (groupLevel == 0 || groupLevel == 3) 00808 { 00809 XmlElement colorElement = cellsElement.OwnerDocument.CreateElement("Color", rdlcNamespaceURI); 00810 colorElement.InnerText = "MediumBlue"; 00811 styleElement.AppendChild(colorElement); 00812 } 00813 00814 XmlElement fontFamilyElement = cellsElement.OwnerDocument.CreateElement("FontFamily", rdlcNamespaceURI); 00815 fontFamilyElement.InnerText = groupsFontFamily; 00816 styleElement.AppendChild(fontFamilyElement); 00817 00818 XmlElement fontSizeElement = cellsElement.OwnerDocument.CreateElement("FontSize", rdlcNamespaceURI); 00819 int fontSize = groupFontSize + groupLevel; 00820 fontSizeElement.InnerText = fontSize.ToString() + fontSizeUnit; 00821 styleElement.AppendChild(fontSizeElement); 00822 00823 if (groupLevel == 1 || groupLevel == 2) 00824 { 00825 XmlElement fontWeightElement = cellsElement.OwnerDocument.CreateElement("FontWeight", rdlcNamespaceURI); 00826 fontWeightElement.InnerText = "Bold"; 00827 styleElement.AppendChild(fontWeightElement); 00828 } 00829 00830 if (groupLevel == 0) 00831 { 00832 XmlElement fontStyleElement = cellsElement.OwnerDocument.CreateElement("FontStyle", rdlcNamespaceURI); 00833 fontStyleElement.InnerText = "Italic"; 00834 styleElement.AppendChild(fontStyleElement); 00835 } 00836 00837 if (groupLevel == 1) 00838 { 00839 XmlElement textDecorationElement = cellsElement.OwnerDocument.CreateElement("TextDecoration", rdlcNamespaceURI); 00840 textDecorationElement.InnerText = "Underline"; 00841 styleElement.AppendChild(textDecorationElement); 00842 } 00843 } 00844 00845 if (reportPart == ReportPart.Details 00846 || reportPart == ReportPart.Header) 00847 { 00848 XmlElement fontFamilyElement = cellsElement.OwnerDocument.CreateElement("FontFamily", rdlcNamespaceURI); 00849 fontFamilyElement.InnerText = bodyFontFamily; 00850 styleElement.AppendChild(fontFamilyElement); 00851 00852 XmlElement fontSizeElement = cellsElement.OwnerDocument.CreateElement("FontSize", rdlcNamespaceURI); 00853 fontSizeElement.InnerText = bodyFontSize; 00854 styleElement.AppendChild(fontSizeElement); 00855 00856 XmlElement AlignmentElement = cellsElement.OwnerDocument.CreateElement("TextAlign", rdlcNamespaceURI); 00857 if (_isRTL) 00858 AlignmentElement.InnerText = "Right"; 00859 else 00860 AlignmentElement.InnerText = "Left"; 00861 styleElement.AppendChild(AlignmentElement); 00862 } 00863 00864 XmlNode value = newNode.SelectSingleNode("//rdlc:Textbox/rdlc:Value", namespaceManager); 00865 switch (reportPart) 00866 { 00867 case ReportPart.Header: 00868 value.InnerText = ReportingTranslation(fullColumnName); 00869 break; 00870 case ReportPart.Details: 00871 case ReportPart.GroupHeader: 00872 if (!string.IsNullOrEmpty(fullColumnName)) 00873 value.InnerText = string.Format("=IIf(IsNothing(Fields!{0}.Value), \"not specified\",Fields!{0}.Value)", columnName); 00874 break; 00875 } 00876 cellsElement.AppendChild(cellFragment); 00877 } 00878 00879 static void SetPageFooterControlsSettings() 00880 { 00881 string footerLineWidthNodePath = "//rdlc:PageFooter/rdlc:ReportItems/rdlc:Line/rdlc:Width"; 00882 XmlNode footerLineWidthNode = root.SelectSingleNode(footerLineWidthNodePath, namespaceManager); 00883 if (footerLineWidthNode != null) 00884 footerLineWidthNode.InnerText = ReportSize(reportWidth); 00885 00886 string footerTextboxNodePath = "//rdlc:PageFooter/rdlc:ReportItems/rdlc:Textbox"; 00887 XmlNodeList footerTextboxes = root.SelectNodes(footerTextboxNodePath, namespaceManager); 00888 foreach (XmlNode footerTextboxNode in footerTextboxes) 00889 { 00890 AddDirrectionNode(footerTextboxNode); 00891 if (footerTextboxNode.Attributes["Name"].Value == "TXTadditionalFooterText") 00892 { 00893 if (string.IsNullOrEmpty(additionalFooterText)) 00894 { 00895 string footerReportItemsNodePath = "//rdlc:PageFooter/rdlc:ReportItems"; 00896 XmlNode footerReportItemsNode = root.SelectSingleNode(footerReportItemsNodePath, namespaceManager); 00897 if (footerReportItemsNode != null) 00898 footerReportItemsNode.RemoveChild(footerTextboxNode); 00899 } 00900 else 00901 { 00902 foreach (XmlNode footerValueNode in footerTextboxNode.ChildNodes) 00903 { 00904 if (footerValueNode.Name == "Value") 00905 footerValueNode.InnerText = string.Format( 00906 "= \"{0}\"" 00907 , additionalFooterText); 00908 } 00909 } 00910 } 00911 00912 if (footerTextboxNode.Attributes["Name"].Value == "TXTprintdate") 00913 { 00914 foreach (XmlNode footerValueNode in footerTextboxNode.ChildNodes) 00915 { 00916 if (footerValueNode.Name == "Value") 00917 footerValueNode.InnerText = string.Format( 00918 "= \"{0}: \" + CStr(CDate(CStr(Now()))) + \", {1}: {2}\"" 00919 , ReportingTranslation("Print Date") 00920 , ReportingTranslation("User") 00921 , currentUser.Name); 00922 00923 if (footerValueNode.Name == "Top" 00924 && string.IsNullOrEmpty(additionalFooterText)) 00925 footerValueNode.InnerText = "0.25cm"; 00926 } 00927 } 00928 00929 if (footerTextboxNode.Attributes["Name"].Value == "TXTpage") 00930 { 00931 int leftNodeIndex = 0; 00932 int i = 0; 00933 double left = 0; 00934 foreach (XmlNode footerValueNode in footerTextboxNode.ChildNodes) 00935 { 00936 if (footerValueNode.Name == "Value") 00937 footerValueNode.InnerText = "= \"" + string.Format( 00938 ReportingTranslation("Page {0} of {1}") 00939 , "\" + CStr(Globals!PageNumber) + \"" 00940 , "\" + CStr(Globals!TotalPages)"); 00941 00942 if (footerValueNode.Name == "Width") 00943 { 00944 double textboxWidth = 0; 00945 bool success = ReportUnitToDouble(footerValueNode.InnerText, out textboxWidth); 00946 if (success) 00947 { 00948 left = reportWidth - textboxWidth; 00949 } 00950 } 00951 00952 if (footerValueNode.Name == "Left") 00953 leftNodeIndex = i; 00954 00955 00956 if (footerValueNode.Name == "Top" 00957 && string.IsNullOrEmpty(additionalFooterText)) 00958 footerValueNode.InnerText = "0.25cm"; 00959 00960 i++; 00961 } 00962 00963 if (left != 0) 00964 footerTextboxNode.ChildNodes[leftNodeIndex].InnerText = ReportSize(left); 00965 } 00966 } 00967 } 00968 #endregion Private methods 00969 //********************************************************************* 00970 #region Utils functions 00971 00972 static void ReversTextBoxs(XmlDocument doc,XmlNamespaceManager namespaceManager) 00973 { 00974 CultureInfo ci = new CultureInfo("en-US"); 00975 NumberFormatInfo numberFormatInfo = ci.NumberFormat; 00976 XmlNodeList list = doc.SelectNodes("//rdlc:Textbox", namespaceManager); 00977 XmlNode interactiveWidthNode = doc.SelectSingleNode("//rdlc:InteractiveWidth", namespaceManager); 00978 float interactiveWidth = GetSize(interactiveWidthNode.InnerText, numberFormatInfo); 00979 foreach (XmlNode textBox in list) 00980 { 00981 float width = GetSize(textBox.SelectSingleNode("rdlc:Width", namespaceManager).InnerText, numberFormatInfo); 00982 XmlNode leftNode = textBox.SelectSingleNode("rdlc:Left", namespaceManager); 00983 if (leftNode == null) 00984 continue; 00985 float left = GetSize(leftNode.InnerText, numberFormatInfo); 00986 00987 left = interactiveWidth - left - width; 00988 00989 left = left > 0 ? left : 0; 00990 00991 leftNode.InnerText = left.ToString(numberFormatInfo) + "cm"; 00992 } 00993 } 00994 00995 static float GetSize(string sizeCm, NumberFormatInfo numberFormatInfo) 00996 { 00997 float size; 00998 size = float.Parse(sizeCm.Substring(0, sizeCm.Length - 2), numberFormatInfo); 00999 return size; 01000 } 01001 01002 static private void AddDirrectionNode(XmlNode node) 01003 { 01004 XmlNode directionNode = root.OwnerDocument.CreateElement("rdlc:Direction", rdlcNamespaceURI); 01005 directionNode.InnerText = _isRTL ? "RTL" : "LTR"; 01006 XmlNode styleNode = node.SelectSingleNode("rdlc:Style", namespaceManager); 01007 if (styleNode == null) 01008 { 01009 styleNode = root.OwnerDocument.CreateElement("rdlc:Style", rdlcNamespaceURI); 01010 node.AppendChild(styleNode); 01011 } 01012 styleNode.AppendChild(directionNode); 01013 } 01014 01015 static bool StringToDouble(string stringToParse, out double number) 01016 { 01017 string separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; 01018 01019 stringToParse = stringToParse.Replace(sizeUnitDecmalSeparator, separator); 01020 01021 return double.TryParse(stringToParse, out number); 01022 } 01023 01024 static string ReportSize(double size) 01025 { 01026 string separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; 01027 return size.ToString().Replace(separator, sizeUnitDecmalSeparator) + sizeUnit; 01028 } 01029 01030 static bool ReportUnitToDouble(string reportUnit, out double size) 01031 { 01032 string separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; 01033 01034 reportUnit = reportUnit.Replace(sizeUnit, string.Empty); 01035 reportUnit = reportUnit.Replace(sizeUnitDecmalSeparator, separator); 01036 01037 return double.TryParse(reportUnit, out size); 01038 } 01039 01040 static string ReportColumnName(string fullColumnName) 01041 { 01042 return fullColumnName.Replace(" ", string.Empty).Replace("-", string.Empty).Replace("(", string.Empty).Replace(")", string.Empty); 01043 } 01044 01045 static string ReportingTranslation(string text) 01046 { 01047 return RAIS.ApplicationLogicLayer.Localisation.Translate(text 01048 , RAIS.Common.Messages.REPORTING_CONTEXT 01049 , RAIS.Common.Constants.DEFAULT_LANGUAGE 01050 , currentUser.Language); 01051 } 01052 01053 static void TranslateTextBoxes(XmlNode node) 01054 { 01055 XmlNodeList nodes = node.SelectNodes("*", namespaceManager); 01056 foreach (XmlNode childNode in nodes) 01057 { 01058 if (childNode.Name == "Textbox") 01059 { 01060 XmlNode textBoxValueNode = childNode.SelectSingleNode("rdlc:Value", namespaceManager); 01061 if (textBoxValueNode != null && textBoxValueNode.InnerText.Length != 0) 01062 { 01063 AddDirrectionNode(childNode); 01064 if (textBoxValueNode.InnerText.Substring(0, 1) != "=") 01065 { 01066 textBoxValueNode.InnerText = 01067 ReportingTranslation(textBoxValueNode.InnerText); 01068 } 01069 } 01070 } 01071 else 01072 { 01073 TranslateTextBoxes(childNode); 01074 } 01075 } 01076 } 01077 #endregion Utils functions 01078 } 01079 }